'use strict'
//创建nunjucks模块
let nunjucks = require('nunjucks');

//创建nunjucks的Environment
function createEnv(path,opts){
    path = path || 'views'; // path 为指定存放模板的目录,默认为 views 目录
    opts = opts || {}   // opts 为可选功能的开启或关闭,默认为空对象

    // 3. 设置环境的配置选项
    let envOptions = {
        // watch：当模板改变时，是否重新加载（默认为false）开发模式下使用true，生产模式下使用false
        watch:opts.watch === undefined?false:opts.watch,
        // noCache：没有缓存，是否需要缓存（默认是false）开发模式下使用true，生产模式下使用false
        noCache:opts.noCache === undefined?false:opts.noCache,
        // autoescape：自动转义,输出是否需要自动转义（默认为true）
        autoescape:opts.autoescape === undefined?false:opts.autoescape,
        // throwOnUndefined：抛出异常，当输出 null 或 undefined 抛出异常（默认为false）
        throwOnUndefined:opts.throwOnUndefined === undefined?false:opts.throwOnUndefined,
        trimBlocks : opts.trimBlocks === undefined?false:opts.trimBlocks,
        lstripBlocks:opts.lstripBlocks === undefined?false:opts.lstripBlocks,
    }
    //4.配置
    let env = nunjucks.configure(path,envOptions);
    //返回 env
    return env;
}

// 5. 此模块作为一个中间件暴露出去，中间件必须为一个函数
module.exports = async(ctx,next)=>{
    // 为 ctx 绑定一个 render 方法,方法有两个参数，view 为视图，也就是需要渲染的模板，model 为模型，也就是所需的数据
    ctx.render = function(view,model){
         // 调用 createEnv() 函数
        let env = createEnv('views',{autoescape:false});
        // 渲染网页
        ctx.body = env.render(view,model);
    }
     // 调用下一个异步函数
    await next();
}